<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    //先定义三个构造函数

    // 构造函数A
    function A() {
      this.name = 'A';
    };
    A.prototype.say = function () {
      return this.name;
    };
    // 构造函数B
    function B() {
      this.name = 'B';
    };
    // 构造函数C
    function C(width, height) {
      this.name = 'C';
      this.width = width;
      this.height = height;
      this.getArea = function () {
        return this.width * this.height;
      };
    };

    // 我们让B的原型链指向A 
    B.prototype = new A();

    // 再让C的原型链指向B 
    C.prototype = new B();
    let c1 = new C(2, 6);
    console.log(c1);   // {name: "C", width: 2, height: 6, getArea: ƒ}
    console.log(c1.name);  // 'C'
    console.log(c1.getArea()); // 12
    console.log(c1.say());  // 'C'

    //这时候我们会发现  C居然也有了say这个函数了  这是因为b继承了 a  b有了say这个方法 而c继承了b   所有c也有了

    // 这里我们会发现一个问题  当我们打印b和c的指向时， 会发现输出的都是A的构造函数
    console.log(B.prototype.constructor);  // ƒ A() {}
    let b1 = new B();
    console.log(b1.constructor);   // ƒ A() {}
    console.log(C.prototype.constructor);


  </script>
</body>

</html>